#!/usr/bin/perl

use File::Path 'rmtree';
use File::stat;
use Sys::Syslog qw( :DEFAULT setlogsock);
use Net::SMTP;
use POSIX;

$programname = 'eipbkp';

logit('info', 'Iniciando respaldo de informacion...');

###########################################
#
#       CONFIGURACION INICIAL 
#
###########################################

# leer archivo de configuracion
$config_file = "/etc/eipbkp/eipbkp.conf";

open(CONFIG, $config_file) or 
	logit('err', 'Imposible leer archivo de configuracion. Abortando...') ||	
	die "Imposible leer archivo de configuracion. Abortando...\n";

$config = join "", <CONFIG>; 
close(CONFIG);
eval $config;


# Configurar variablesa varias.
$temp_bkp = $temp_dir . '/eipbkptmp/';
$fecha = `date "+%d-%m-%Y"`;
chomp $fecha;
$image = $temp_dir . '/backup.img';
$mkisofs = $mkisofs . ' -V ' . $fecha . ' -U -r -o ' . $image . ' ' . $temp_bkp;


# Configurar medio de respaldo y metodo de escritura.
if($media_type eq 'usbdev')
{
	$burn_command = $mkfs .' ' . $device . ' && ' . $mount . ' '  
		. $device . ' ' . $mntpoint . '  && ' . $cp . ' -R ' . $temp_bkp . '* ' 
		. $mntpoint . ' && ' . $umount . ' ' . $mntpoint;
}
elsif($media_type eq 'dvdrw')
{
	$burn_command = $dvdrw_format . ' -force ' . $device . '  && ' . $growisofs . ' -Z ' . $device . '=' . $image;
}
elsif($media_type eq 'dvdr')
{
	$burn_command = $growisofs . ' -Z ' . $device . '=' . $image;
}
elsif($media_type eq 'cdrw')
{
	$burn_command = $cdrecord . ' -v --dev=' . $device . ' -blank=fast -tao ' . $image;
}
elsif($media eq 'cdr')
{
	$burn_command = $cdrecord . ' --dev=' . $device . ' -tao ' .$image;
}
else
{
	logit('err', 'Parametro de configuracion del medio de respaldo incorrecto. Abortando...');
	die "\nParametro de configuracion del medio de respaldo incorrecto. Abortando...\n";
}


# Crear directorio temporal.
mkdir($temp_bkp);



###########################################
#
#        RESPADO DE FILESYSTEMS           
#
###########################################

if ($filesystem_enable eq 'yes')
{
	# Cargar lista de directorios a respaldar.
	open(DIRECTORIES, '/etc/eipbkp/directories') or 
		logit('err', 'Imposible cargar lista de directorios a respaldar. Abortando...') ||
		die "\nImposible cargar lista de directorios a respaldar. Abortando...\n";

	logit('info', 'Respaldando Filesystems...');

	while(<DIRECTORIES>)
	{
		chomp;
		push(@directories, "$_");
	}

	close(DIRECTORIES);


	# Crear directorio FILESYSTEMS
	mkdir($temp_bkp . 'FILESYSTEMS/');


	# Comprimir directorios.
	foreach $temp (@directories)
	{
		$temp2 = $temp;
		$temp2 =~ s/\//\./g; 
		$temp2 = substr $temp2, 1;
		$temp2 = $temp_bkp . 'FILESYSTEMS/' . $temp2 . '.tar.gz';
		system($gtar, 'zcf', $temp2, $temp);
	}
}



###########################################
#
#        RESPADO DE LDAP
#
###########################################

if($ldap_enable eq 'yes')
{
	logit('info', 'Respaldando LDAP...');

	# Crear directorio LDAP
	mkdir($temp_bkp . 'LDAP/');


	# Comprimir directorio LDAP
	$ldap_bkp_command = $ldapsearch . ' -x -b ' . $ldap_root . ' objectclass=* | '
		 . $gzip . ' -c > ' . $temp_bkp . 'LDAP/ldap.diff.gz';
	system($ldap_bkp_command);
}



###########################################
#
#        RESPADO DE POSTGRESQL
#
###########################################

if($pg_enable eq 'yes')
{
	logit('info', 'Respaldando PostgreSQL...');

	# Configurar pg_dump.
	$pg_dump = $pg_dump . ' -h ' . $pg_addr . ' -U ' . $pg_user . ' -Fc '; 


	# Cargar lista de bases de datos a respaldar.
	open(POSTGRES, '/etc/eipbkp/postgresql') or 
		logit('err', 'Imposible cargar lista de bases datos Postgres a respaldar. Abortanto...') ||
		die "\nImposible cargar lista de bases datos Postgres a respaldar. Abortanto...\n";

	while(<POSTGRES>)
	{
		chomp;
		push(@postgres, "$_");
	}

	close (POSTGRES);


	# Crear directorio POSTGRESQL.
	mkdir($temp_bkp . 'POSTGRESQL/');


	# Comprimir bases de datos.
	foreach $temp (@postgres)
	{
		$pg_backup_command = $pg_dump . $temp . ' | ' . $gzip . ' -c > ' . $temp_bkp 
			. 'POSTGRESQL/' . $temp . '.backup.gz';
		system($pg_backup_command);
	}
}



###########################################
#
#        RESPALDO DE MYSQL
#
###########################################

if($mysql_enable eq 'yes')
{
	logit('info', 'Respaldando MySQL...');

	# Configurar mysqldump.
	$mysqldump = $mysqldump . ' -h ' . $my_addr . ' -ac --add-drop-table -u ' 
		. $my_user . ' --password=' . $my_passwd . ' ';


	# Cargar la lista de bases de datos MySQL.
	open (MYSQL, '/etc/eipbkp/mysql') or 
		logit('err', 'Imposible cargar lista de bases datos MySQL a respaldar. Abortanto...') ||
		die "\nImposible cargar lista de bases datos MySQL a respaldar. Abortanto...\n";

	while(<MYSQL>)
	{
		chomp;
		push(@mysql, "$_");
	}

	close (MYSQL);


	# Crear directorio MYSQL.
	mkdir($temp_bkp . 'MYSQL/');


	# Comprimir bases de datos.
	foreach $temp (@mysql)
	{
		$mysql_backup_command = $mysqldump . $temp . ' | ' . $gzip . ' -c > '  
			. $temp_bkp . 'MYSQL/' . $temp . '.sql.gz';
		system($mysql_backup_command);
	}
}



###########################################
#
#        RESPALDO DE SAMBA
#
###########################################

if ($samba_enable eq 'yes')
{
	logit('info', 'Respaldando SAMBA...');

        # Cargar lista de directorios SAMBA a respaldar.
        open(SAMBA, '/etc/eipbkp/samba') or 
		logit('err', 'Imposible cargar lista de directorios SAMBA a respaldar. Abortando...') ||
		die "\nImposible cargar lista de directorios SAMBA a respaldar. Abortando...\n";

        while(<SAMBA>)
        {
                chomp;
                push(@samba, "$_");
        }

        close(SAMBA);


        # Crear directorio SAMBA.
        mkdir($temp_bkp . 'SAMBA/');


        # Comprimir directorios SAMBA.
        foreach $temp (@samba)
        {
		$mount = $mount . ' -t cifs -o username=' . $samba_user . ',password=' 
			. $samba_passwd . ',domain=' . $samba_domain . ' ' . $temp . ' /mnt';

		system($mount);

                $temp2 = $temp;
                $temp2 =~ s/\//_/g;
                $temp2 = substr $temp2, 1;
                $temp2 = $temp_bkp . 'SAMBA/' . $temp2 . '.tar.gz';

                system($gtar, 'zcf', $temp2, '/mnt');
		system($umount . ' /mnt');
        }
}



###########################################
#
#        GRABAR MEDIOS
#
###########################################

# Crear imagen de CD
system($mkisofs);

# Calcular tamaño del backup
$backup_size = -s $image;
$backup_size = floor($backup_size / 1048576);

if($burn_and_clean eq 'yes')
{
	# Si es dispositivo USB, desmontar antes de proceder...
	if($media_type eq 'usbdev'){
		system($umount . ' ' . $mntpoint)
		}


	# Grabar la imagen al medio.
	system($burn_command);


	# Borrar el directorio temporal.
	rmtree([$temp_bkp]);


	# Borrar la imagen.
	unlink($image);


	# Expulsar el medio.
	if($eject_media eq 'yes')
	{
		$eject = $eject . ' ' . $device;
		system($eject);
	}	
}


logit('info', 'Respaldados ' . $backup_size . ' MB.');
logit('info', 'Fin del proceso de backup.');


###########################################
#
#        ENVIAR REPORTE POR MAIL
#
###########################################

if($send_mail eq 'yes')
{
	$dominio = substr($admin_email, rindex($admin_email, '@') +1);

	$smtp = Net::SMTP->new($dominio);
	$smtp->mail($my_email);
	$smtp->to($admin_email);
	$smtp->data();
	$smtp->datasend("SUBJECT: Reporte de backup en $id\n");
	$smtp->datasend("\n");
	$smtp->datasend("El backup correspondiente al dia $fecha se ha realizado correctamente en $id.\n\n");
	$smtp->datasend("Detalle:\n");
	$smtp->datasend("========\n\n");
	
	if($filesystem_enable eq 'yes')
	{
		$smtp->datasend("*) Sistemas de archivo respaldados:\n");

        	open(DIRECTORIES, '/etc/eipbkp/directories') or
                	logit('err', '(CORREO) Imposible cargar lista de directorios a respaldar. Abortando...') ||
                	die "\n(CORREO) Imposible cargar lista de directorios a respaldar. Abortando...\n";

        	while(<DIRECTORIES>)
        	{
                	chomp;
                	$smtp->datasend("	$_\n");
        	}	
        	close(DIRECTORIES);
	}

	$smtp->datasend("\n");

	if($ldap_enable eq 'yes')
	{
		$smtp->datasend("*) Directorio LDAP respaldado:\n");
		$smtp->datasend("	$ldap_root\n");
	}
		
	$smtp->datasend("\n");

	if($pg_enable eq 'yes')
	{
		$smtp->datasend("*) Bases de datos PostgreSQL respaldadas:\n");

                open(POSTGRES, '/etc/eipbkp/postgresql') or
                        logit('err', '(CORREO) Imposible cargar lista de bases PostgreSQL a respaldar. Abortando...') ||
                        die "\n(CORREO) Imposible cargar lista de bases PostgreSQL a respaldar. Abortando...\n";

                while(<POSTGRES>)
                {
                        chomp;
                        $smtp->datasend("       $_\n");
                }
                close(POSTGRES);

	}

	$smtp->datasend("\n");

        if($mysql_enable eq 'yes')
        {
                $smtp->datasend("*) Bases de datos MySQL respaldadas:\n");

                open(MYSQL, '/etc/eipbkp/mysql') or
                        logit('err', '(CORREO) Imposible cargar lista de bases PostgreSQL a respaldar. Abortando...') ||
                        die "\n(CORREO) Imposible cargar lista de bases PostgreSQL a respaldar. Abortando...\n";

                while(<MYSQL>)
                {
                        chomp;
                        $smtp->datasend("       $_\n");
                }
                close(MYSQL);

        }

	$smtp->datasend("\n");

        if($samba_enable eq 'yes')
        {
                $smtp->datasend("*) Directorios SAMBA respaldados:\n");

                open(SAMBA, '/etc/eipbkp/samba') or
                        logit('err', '(CORREO) Imposible cargar lista de directorios SAMBA a respaldar. Abortando...') ||
                        die "\n(CORREO) Imposible cargar lista de directorios SAMBA a respaldar. Abortando...\n";

                while(<SAMBA>)
                {
                        chomp;
                        $smtp->datasend("       $_\n");
                }
                close(SAMBA);

        }

	$smtp->datasend("\n");

	$smtp->datasend("Se respaldaron $backup_size MB de informacion a $device. Verifique el registro de eventos\n");
	$smtp->datasend("para mayor informacion.\n\n");
	$smtp->datasend("Saludos Cordiales.-\n\n");
	$smtp->datasend("EIPBKP\n");
	$smtp->datasend("Estudio Informatico Patagonico\n");
	$smtp->datasend("tel./fax +54 (299) 436 6926\n");
	$smtp->datasend("info\@eipsistemas.com.ar\n");
	$smtp->datasend("http://www.eipsistemas.com.ar\n");
	$smtp->dataend();
	$smtp->quit;
}



exit;

sub logit
{
	my ($priority, $msg) = @_; 
	return 0 unless ($priority =~ /info|err|debug/);

	setlogsock('unix');
	openlog($programname, 'pid,cons', 'user');
	syslog($priority, $msg);
	closelog();
	return 1;
}
